package ar.com.uade.administradorsiembra.controladores;

import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import ar.com.uade.administradorsiembra.common.LoteCantidad;
import ar.com.uade.administradorsiembra.modelo.Cereal;
import ar.com.uade.administradorsiembra.modelo.Cosecha;
import ar.com.uade.administradorsiembra.modelo.Cosechadora;
import ar.com.uade.administradorsiembra.modelo.ItemSiembra;
import ar.com.uade.administradorsiembra.modelo.Lote;
import ar.com.uade.administradorsiembra.modelo.Siembra;
import ar.com.uade.administradorsiembra.modelo.exceptions.CantidadSembradaInsuficienteParaCosechaException;
import ar.com.uade.administradorsiembra.modelo.exceptions.TransaccionException;
import ar.com.uade.administradorsiembra.persistencia.CerealMapper;
import ar.com.uade.administradorsiembra.persistencia.CosechaMapper;
import ar.com.uade.administradorsiembra.persistencia.ItemSiembraMapper;
import ar.com.uade.administradorsiembra.persistencia.LoteMapper;
import ar.com.uade.administradorsiembra.persistencia.SiembraMapper;
import ar.com.uade.administradorsiembra.views.CerealView;
import ar.com.uade.administradorsiembra.views.LoteView;

public class RegistrarCosechaController {
	private static RegistrarCosechaController controller;
	private CerealMapper cerealMapper;
	private SiembraMapper siembraMapper;
	private ItemSiembraMapper itemSiembraMapper;
	private LoteMapper loteMapper;
	private CosechaMapper cosechaMapper;
	
	private RegistrarCosechaController(){	
	}
	
	private CerealMapper getCerealMapper(){
		if(cerealMapper == null){
			cerealMapper = new CerealMapper();
		}
		
		return cerealMapper;
	}
	
	private ItemSiembraMapper getItemSiembraMapper(){
		if(itemSiembraMapper == null){
			itemSiembraMapper = new ItemSiembraMapper();
		}
		
		return itemSiembraMapper;
	}
	
	private SiembraMapper getSiembraMapper(){
		if(siembraMapper == null){
			siembraMapper = new SiembraMapper();
		}
		
		return siembraMapper;
	}
	
	private LoteMapper getLoteMapper(){
		if(loteMapper == null){
			loteMapper = new LoteMapper();
		}
		
		return loteMapper;
	}
	
	private CosechaMapper getCosechaMapper(){
		if(cosechaMapper == null){
			cosechaMapper = new CosechaMapper();
		}
		
		return cosechaMapper;
	}
	
	public static RegistrarCosechaController getInstancia(){
		if(controller == null) {
			controller = new RegistrarCosechaController();
		}
		
		return controller;
	}
	
	public List<CerealView> getCereales() {
		List<Cereal> cereales = this.getCerealMapper().buscarTodos();
		List<CerealView> cerealesView = new ArrayList<CerealView>();
		
		for (Cereal cereal : cereales) {
			cerealesView.add(cereal.getView());
		}
		
		return cerealesView;
	}
	
	public List<LoteView> getLotes(Integer codigoCereal, Date fechaDesde, Date fechaHasta) {
		List<LoteView> lotes = new LinkedList<LoteView>();
		
		for (ItemSiembra itemSiembra : this.getItemSiembraMapper().buscarPorCereal(codigoCereal, fechaDesde, fechaHasta)) {
			lotes.add(itemSiembra.getLote().getView());			
		}
		
		return lotes;
	}
	
	public void registrarCosecha(Integer codCereal, Date fechaDesde,
			Date fechaHasta, List<LoteCantidad> loteCantidad)
			throws CantidadSembradaInsuficienteParaCosechaException,
			TransaccionException {

		List<Siembra> siembras = getSiembraMapper().buscarNoCosechados(codCereal);

		Cosechadora cosechadora = new Cosechadora();
		Cosecha cosecha = null;
		Lote lote = null;
		if(siembras != null){
			for (Siembra siembra : siembras) {
	
				cosecha = cosechadora.getCosecha(siembra.getCereal(), fechaDesde, fechaHasta);
				for (LoteCantidad loteCant : loteCantidad) {
					lote = getLoteMapper().buscarPorId(loteCant.getNumLote());
					cosecha.cosecharLote(lote, loteCant.getCantidad());
					getLoteMapper().guardar(lote);
					getCosechaMapper().guardar(cosecha);
				}
			}
		}
	}
}
